﻿//using Recast;

//var files = new List<string>();
//files.AddRange(Directory.GetFiles(@"D:\recastnavigation_share\Detour", "*.h", SearchOption.AllDirectories));
//files.AddRange(Directory.GetFiles(@"D:\recastnavigation_share\Detour", "*.cpp", SearchOption.AllDirectories));
//files.AddRange(Directory.GetFiles(@"D:\recastnavigation_share\Recast", "*.h", SearchOption.AllDirectories));
//files.AddRange(Directory.GetFiles(@"D:\recastnavigation_share\Recast", "*.cpp", SearchOption.AllDirectories));

////if (!Directory.Exists(@"D:\Recast\src\Include\"))
////    Directory.CreateDirectory("D:\\Recast\\src\\Include\\");
////if (!Directory.Exists(@"D:\Recast\src\Source\"))
////    Directory.CreateDirectory("D:\\Recast\\src\\Source\\");

//Dictionary<string, TypeModel> types = new Dictionary<string, TypeModel>
//{
//    { "ClassGlobal", new TypeModel("ClassGlobal") }
//};

//CppAnalysis cppAnalysis = new CppAnalysis();

//foreach (var file in files)
//{
//    var text = File.ReadAllText(file);
//    text = text.Replace("const", "");
//    text = text.Replace("ref", "Ref");
//    text = text.Replace("params", "Params");
//    text = text.Replace("out", "Out");
//    text = text.Replace("base", "@base");
//    text = text.Replace("::new", "//::new");
//    text = text.Replace("if (!", "if (null==");
//    text = text.Replace("public:", "");
//    text = text.Replace("private:", "");
//    text = text.Replace("protected:", "");
//    text = text.Replace("unsbyte", "byte");
//    text = text.Replace("unsigned short", "ushort");
//    text = text.Replace("unsigned int", "uint");
//    text = text.Replace("unsigned long long", "ulong");
//    text = text.Replace("unsigned long", "ulong");
//    text = text.Replace("unsigned", "uint"); //如果只包含unsigned也是uint

//    text = text.Replace("size_t", "int");
//    //text = text.Replace("typedef", "delegate");
//    //text = text.Replace("enum", "public enum");
//    //text = text.Replace("class", "public unsafe partial class");
//    //text = text.Replace("struct", "public unsafe partial struct");
//    text = text.Replace("#ifndef", "//#ifndef");
//    text = text.Replace("#define", "//#define");
//    text = text.Replace("#include", "//#include");
//    text = text.Replace("#endif", "//#endif");
//    text = text.Replace("NULL", "null");
//    text = text.Replace("rcCompactCell&", "ref rcCompactCell");
//    text = text.Replace("rcCompactSpan&", "ref rcCompactSpan");
//    text = text.Replace("rcCompactSpan&", "ref rcCompactSpan");
//    text = text.Replace("rcCompactHeightfield&", "ref rcCompactHeightfield");
//    text = text.Replace("context->log", "//context->log");
//    text = text.Replace("#ifdef", "#if");

//    //goto GO;

//    var newCodeText = "";
//    text = text.Replace("  ", " ");
//    int idx;
//    while (true)
//    {
//        idx = text.LastIndexOf("  ");
//        if (idx == -1)
//            break;
//        text = text.Remove(idx, 1);
//    }
//    while (true) //分离注释/**/
//    {
//        idx = text.IndexOf("/*");
//        if (idx == -1)
//            break;
//        int y = 0;
//        for (int x = idx; x < text.Length; x++)
//        {
//            if (text[x] == '/' & text[x + 1] == '*')
//                y++;
//            else if (text[x] == '*' & text[x + 1] == '/')
//            {
//                if (--y <= 0)
//                {
//                    text = text.Remove(idx, (x - idx) + 2).Trim();
//                    break;
//                }
//            }
//        }
//    }
//    while (true) //分离注释
//    {
//        idx = text.IndexOf("//");
//        if (idx == -1)
//            break;
//        var idx1 = text.IndexOf("\r\n", idx);
//        if (idx1 == -1) //到结尾了
//            idx1 = text.Length;
//        text = text.Remove(idx, idx1 - idx);
//    }
//    text = text.Trim();
//    while (text.Contains("\t"))
//    {
//        text = text.Replace("\t", "");
//    }
//    while (text.Contains("\r\n\r\n"))
//    {
//        text = text.Replace("\r\n\r\n", "\r\n");
//    }
//    cppAnalysis.Sort(ref text, ")", "}", "template");
//    while (true)
//    {
//        idx = text.IndexOf("namespace");
//        if (idx == -1)
//            break;
//        var idx1 = text.IndexOf("{", idx);
//        //var test = text.Substring(idx);
//        text = text.Remove(idx, (idx1 - idx) + 1);
//        //test = text.Substring(idx);
//        int i = idx;
//        int n = 1;
//        while (true)
//        {
//            if (text[i] == '{')
//            {
//                n++;
//            }
//            if (text[i] == '}')
//            {
//                if (--n <= 0)
//                {
//                    text = text.Remove(i, 1);
//                    break;
//                }
//            }
//            i++;
//        }
//    }
//    while (text.Length > 0)
//    {
//        if (text.IndexOf("DETOURASSERT_H", 0, text.Length < 50 ? text.Length : 50) > 0)
//        {

//        }
//        text = text.TrimStart(' ');
//        if (text.StartsWith("//") | text.StartsWith("\\") | text.StartsWith("#ifndef") | text.StartsWith("#define") | text.StartsWith("#include") |
//            text.StartsWith("\r\n") | text.StartsWith("#endif") | text.StartsWith("}") | text.StartsWith("#"))
//        {
//            var index = text.IndexOf("\r\n");
//            if (index == -1)
//                break;
//            var row = text.Substring(0, index + 2);
//            text = text.Remove(0, index + 2).Trim();
//            newCodeText += row;
//        }
//        else
//        {
//            if (text.StartsWith("public"))
//                text = text.TrimStart("public".ToCharArray()).Trim();
//            if (text.StartsWith("enum"))
//            {
//                cppAnalysis.EnumHandler(ref text);
//            }
//            else if (text.StartsWith("class"))
//            {
//                cppAnalysis.ClassHandler(ref text, true, false);
//            }
//            else if (text.StartsWith("struct"))
//            {
//                //cppAnalysis.StructHandler(ref text, false, true);
//                cppAnalysis.ClassHandler(ref text, false, true);
//            }
//            else if (text.StartsWith("/*"))
//            {
//                int y = 0;
//                for (int x = 0; x < text.Length; x++)
//                {
//                    if (text[x] == '/' & text[x + 1] == '*')
//                        y++;
//                    else if (text[x] == '*' & text[x + 1] == '/')
//                    {
//                        y--;
//                        if (y <= 0)
//                        {
//                            var note = text.Substring(0, x + 2);
//                            text = text.Remove(0, x + 2).Trim();
//                            newCodeText += note + "\r\n";
//                            break;
//                        }
//                    }
//                }
//            }
//            else if (text.StartsWith("public:") | text.StartsWith("private:") | text.StartsWith("protected:"))
//            {
//            }
//            else
//            {
//                cppAnalysis.GlobalMethodHandler(ref text);
//            }

//        }
//    }
//    text = text.Insert(0, @"using System.Runtime.CompilerServices;
//using dtPolyRef = System.UInt32;
//using dtTileRef = System.UInt32;
//using dtStatus = System.UInt32;
//using dtPathQueueRef = System.UInt32;
//using dtObstacleRef = System.UInt32;
//using dtCompressedTileRef = System.UInt32;
//using rcSizeType = System.Int64;
//using flzuint8 = System.Byte;
//using flzuint16 = System.UInt16;
//using flzuint32 = System.UInt32;
//using TimeVal = System.Int64;
//using System.Runtime.InteropServices;

//namespace Recast
//{
//    public unsafe partial class RecastApiGlobal
//    {" + "\r\n");
//    text += "    }\r\n}";
//    //var fileName = Path.GetFileNameWithoutExtension(file);
//    //if (Path.GetExtension(file) == ".h")
//    //{
//    //    var newPath = @"D:\Recast\src\Include\" + fileName + ".cs";
//    //    File.WriteAllText(newPath, text);
//    //}
//    //else if (Path.GetExtension(file) == ".cpp")
//    //{
//    //    var newPath = @"D:\Recast\src\Source\" + fileName + ".cs";
//    //    File.WriteAllText(newPath, text);
//    //}
//}

//if (!Directory.Exists(@"D:\RecastTest\src\"))
//    Directory.CreateDirectory("D:\\RecastTest\\src\\");

//foreach (var type in cppAnalysis.Types.Values)
//{
//    if (type.typeName == "dtNavMeshQuery")
//    {

//    }
//    var code = type.ToCode();
//    //Debug.WriteLine(code);
//    File.WriteAllText(@"D:\RecastTest\src\" + type.typeName.Replace("<T, H>", "") + ".cs", code);
//}

//Console.WriteLine("Hello, World!");